import os
import json
from pathlib import Path
from typing import Any, Dict, Optional

class SysConfigManager:
    def __init__(self, config_path: str = 'D:/AIClass/chat2money/config/sysconfig.json', sys_project_path: str = './'):
        """
        初始化 SysConfigManager 实例。

        :param config_path: 配置文件的相对或绝对路径，默认为 './config/sysconfig.json'
        """
        self.config_path = Path(config_path).resolve()
        self.config_data: Dict[str, Any] = {}
        self.sys_project_path = sys_project_path
        self.load_config()

    def load_config(self):
        """
        从指定路径加载配置文件。
        如果文件不存在或格式不正确，则抛出异常。
        """
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                self.config_data = json.load(f)
        except FileNotFoundError:
            raise FileNotFoundError(f"配置文件未找到: {self.config_path}")
        except json.JSONDecodeError as e:
            raise ValueError(f"配置文件格式错误: {e}")

    def get_config(self, key: str) -> Optional[Any]:
        """
        根据键名获取配置项值。

        :param key: 配置项的键名
        :return: 对应的配置项值，如果键不存在则返回 None
        """
        return self.config_data.get(key)

    def resolve_path(self, relative_path: str) -> Path:
        """
        将配置文件中的相对路径解析为绝对路径。

        :param relative_path: 相对路径字符串
        :return: 解析后的绝对路径
        """
        if not os.path.isabs(relative_path):
            # 假设相对路径是相对于配置文件所在目录
            base_dir = self.config_path.parent.parent
            absolute_path = (base_dir / relative_path).resolve()
        else:
            absolute_path = Path(relative_path).resolve()
        return absolute_path

    def get_config_path(self, key: str) -> Optional[Path]:
        """
        获取并解析配置项中的路径。

        :param key: 配置项的键名
        :return: 解析后的绝对路径，如果键不存在或不是路径类型则返回 None
        """
        value = self.get_config(key)
        if isinstance(value, str):
            return str(self.resolve_path(value))
        return None

    def __repr__(self) -> str:
        """
        返回对象的字符串表示，用于调试。
        """
        return f"SysConfigManager(config_path={self.config_path})"

# 示例用法
if __name__ == "__main__":
    config_manager = SysConfigManager()
    print("配置文件路径:", config_manager.config_path)
    
    # 获取并打印某个配置项
    datasets_dir = config_manager.get_config_path('DATASETS_DIR_PATH')
    print("数据集目录:", datasets_dir)
    
    dashscope_api_key_file = config_manager.get_config_path('DASHSCOPE_API_KEY_FILE_PATH')
    print("API-KEY文件:", dashscope_api_key_file)

    
    # 直接获取非路径类型的配置项
    collection_name = config_manager.get_config_path('CHROMADB_COLLECTION_NAME')
    print("集合名称:", collection_name)